package main

import "fmt"

//func main() {
//	fmt.Println("test1")
//	//defer之后只能是函数调用 不能是表达式比如a++
//	defer fmt.Println("defer test") //程序中途出现异常也会执行
//	defer fmt.Println("defer test2")
//	defer fmt.Println("defer test3")
//	//panic("error")  //对于程序制造异常
//	fmt.Println("test2")
//	//1.如果有多个defer,使用的是栈存储,后进先出
//
//}

//func main() {
//	//执行的过程也是类似于压栈的过程
//	//会打印test1
//	test := func() {
//		fmt.Println("test1")
//	}
//	defer test()
//	test = func() {
//		fmt.Println("test2")
//	}
//	fmt.Println("test3")
//}

//func main() {
//	//defer 语句执行时的拷贝机制 会打印10
//	x := 10
//	defer func(a int) {
//		fmt.Println(a)
//	}(x)
//	x++
//}
//func main() {
//	//defer 语句执行时的拷贝机
//	x := 10
//	//此处的defer函数并没有参数，函数内部使用的值是全局的值，所以会被修改
//	defer func() {
//		fmt.Println(x)
//	}()
//	x++
//}
func f1() int {
	x := 10
	defer func() {
		x++
	}()
	temp := x
	return temp
}
func f2() *int {
	a := 10
	b := &a
	defer func() {
		*b++
	}()
	temp_data := b
	return temp_data
}

func main() {
	fmt.Println(f1()) //是不是意味着defer中影响不到外部的值
	fmt.Println(*f2())
	//defer 本质是注册了一个延迟函数，defer函数的执行顺序已经确定
	//defer 没有嵌套defer的机制是要取代 try except finally
}
